﻿using UnityEngine;
using System.Collections;

namespace TowerDefence
{
    public class TowerLaser : MonoBehaviour
    {
        AudioManager audioManager; // 音频管理器
        [HideInInspector]
        public Tower tower; // 塔的数据
        [HideInInspector]
        public Transform target; // 目标敌人的位置
        public float spreadRadius = 0f; // 攻击范围半径
        public Transform aoePoint; // AOE 攻击的中心点

        [Header("Effect")]
        public GameObject impactParticle; // 激光命中效果

        [Header("Audio")]
        public AudioSource impactAudio; // 命中音效

        Vector3 impactNormal; // 命中法线向量

        Vector3 hitPosOffset = new Vector3(0, 1, 0); // 命中位置的偏移量

        void Update()
        {
            if (target == null) return; // 如果目标为空，则返回

            impactNormal = transform.position; // 设置命中法线向量

            HitTarget(); // 命中目标

            transform.LookAt(target.transform); // 朝向目标
        }

        void HitTarget()
        {
            if (spreadRadius > 0f)
            {
                AOE(); // 进行AOE攻击
            }
            else
            {
                Damage(target); // 造成伤害给单个目标
            }
        }

        void AOE()
        {
            print("AOE ATTACKING"); // 打印信息，表示进行AOE攻击
            Collider[] colliders = Physics.OverlapSphere(aoePoint.position, spreadRadius); // 获取半径内的所有碰撞体
            foreach (Collider collider in colliders)
            {
                if (collider.tag.Equals(StringData.enemyTag)) // 如果碰撞体标签为敌人
                {
                    Damage(collider.transform); // 造成伤害给敌人
                }
            }
        }

        void Damage(Transform enemy)
        {
            Enemy e = enemy.GetComponent<Enemy>(); // 获取敌人组件
            if (e != null)
            {
                TowerData tD = tower.tD; // 获取塔的数据

                // 敌人可能对某些类型的塔免疫
                if (e.immunity == tD.towerType)
                    return;

                float dmg = Random.Range(tower.tD.minDamage, tower.tD.maxDamage); // 随机伤害值

                for (int i = 0; i < tD.effects.Count; i++)
                {
                    e.ApplyEffects(tD.effects[i]); // 应用效果
                }

                e.TakeLaserDamage(dmg * tD.fireRate, tD.damageType); // 造成激光伤害

                // 下面的代码是关于激光命中效果的实例化和销毁，根据需要解开注释
                //impactParticle = Instantiate(impactParticle, impactNormal, Quaternion.FromToRotation(Vector3.up, impactNormal)) as GameObject;
                //impactParticle.transform.parent = target.transform;
                //Destroy(impactParticle, 3);
            }
        }
    }
}